`
https://leetcode.cn/problems/koko-eating-bananas/
`

/**
 * @param {number[]} piles
 * @param {number} h
 * @return {number}
 */
var minEatingSpeed = function (piles, h) {
  // 此处将右边界初始化为 10^9
  // 由于二分为对数级别的复杂度，所以 right 就算是个很大的值，算法的效率依然很高
  // 参考：log2(1000000000) = 29.897352854...
  let left = 1, right = 1000000000

  // 定义：速度为 x 时，需要 f(x) 小时吃完所有香蕉
  // f(x) 随着 x 的增加单调递减
  const f = (x) => {
    let hours = 0;
    for (let i = 0; i < piles.length; i++) {
      hours += Math.floor(piles[i] / x);
      if (piles[i] % x > 0) {
        hours++;
      }
    }
    return hours;
  }

  while (left <= right) {
    const mid = left + Math.floor((right - left) / 2)
    const time = f(mid)

    // 注意： f(x) 单调递减
    if (time > h) {
      left = mid + 1
    } else {
      right = mid - 1
    }
    // if (time > h) {
    //   left = mid + 1
    // } else if (time < h) {
    //   right = mid - 1
    // } else if (time === h) {
    //   right = mid - 1
    // }
  }

  return left
};